//开发商购买土地  卡码网44 
//借鉴了前缀和的思想，先计算出总的价值，后续对另一半的价值的计算直接用总价值减去这一半就可以
//避免了重复计算
//法一：
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	cin >> n >> m;
	vector<vector<int>> vec(n,vector<int>(m));
	int sum = 0;
	//计算总和
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
		{
			cin >> vec[i][j];
			sum += vec[i][j];
		}
	//计算每一行
	vector<int> horizontal(n,0);
	for(int i = 0; i < n; i++)
		for(int j = 0; j <m; j++)
		{
			horizontal[i] += vec[i][j];
		}
	//计算每一列
	vector<int> vertical(m,0);
	for(int i = 0; i < m; i++)
		for(int j = 0; j <n; j++)
		{
			vertical[i] += vec[j][i];
		}
	//遍历每一行
	int result = INT_MAX;
	int horizontalCut = 0;
	for(int i  = 0; i < n; i++)
	{
		horizontalCut += horizontal[i];
		result = min(result,abs(sum-horizontalCut-horizontalCut));
	}
	//遍历每一列
	int verticalCut = 0;
	for(int i  = 0; i < m; i++)
	{
		verticalCut += vertical[i];
		result = min(result,abs(sum-verticalCut-verticalCut));
	}
	cout << result;
	return 0;
}
//改进后：
//不用先计算每一行的和或每一列的和，可直接用cnt在行或列的末尾进行统计
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	cin >> n >> m;
	vector<vector<int>> vec(n,vector<int>(m));
	int sum = 0;
	//计算总和
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
		{
			cin >> vec[i][j];
			sum += vec[i][j];
		}
	//遍历每一行，每到行末尾就统计一次
	int result = INT_MAX;
	int cnt = 0;
	for(int i = 0; i < n; i++)
		for(int j = 0; j <m; j++)
		{
			cnt += vec[i][j];
			if(j == m - 1)result = min(result,abs(sum - cnt -cnt));
		}
	//遍历每一列，每到列末尾就统计一次
	cnt = 0;
	for(int i = 0; i < m; i++)
		for(int j = 0; j <n; j++)
		{
			cnt += vec[j][i];
			if(j == n - 1) result = min(result,abs(sum - cnt -cnt));
		}
	cout << result;
	return 0;
}
